package com.huawei.cloud.phone.management.domain.phone;

import org.springframework.lang.NonNull;

import java.util.List;
import java.util.Optional;

public interface PhoneGateway {
    /**
     * 查询管理面手机信息
     *
     * @param serverId 手机服务器ID
     * @return 手机信息
     */
    List<Phone> getPhonesFromManager(@NonNull String serverId);

    Optional<Phone> getPhoneFromManager(@NonNull String phoneId);

    /**
     * 查询手机信息
     *
     * @param serverIds 手机服务器ID
     * @return 服务器下的手机信息
     */
    List<Phone> getPhonesByServerIds(@NonNull List<String> serverIds);

    /**
     * 查询手机信息
     *
     * @param phoneIds 手机ID
     * @return 手机信息
     */
    List<Phone> getPhonesByPhoneIds(@NonNull List<String> phoneIds);

    /**
     * 给定一组服务器ID，查询其中未纳管的服务器ID集合
     *
     * @param serverIds 服务器ID集合
     * @return 未纳管的服务器ID集合
     */
    List<String> getNotManagerServerId(@NonNull List<String> serverIds);

    /**
     * 给定一组手机ID，查询其中未纳管的手机ID集合
     *
     * @param phoneIds 手机ID集合
     * @return 未纳管的手机ID集合
     */
    List<String> getNotManagerPhoneId(@NonNull List<String> phoneIds);

    /**
     * 保存云手机信息，数据库已经存在时，刷新云手机和镜像ID数据
     *
     * @param phones 云手机信息
     */
    void savePhones(@NonNull List<Phone> phones);

    /**
     * 清除手机
     *
     * @param serverId 服务器ID
     */
    void clearPhones(@NonNull String serverId);

    /**
     * 查询可以使用的手机信息
     *
     * @return 可以使用的手机
     */
    List<Phone> getReadyPhones();

    /**
     * 修改手机可使用状态
     *
     * @param phoneId   手机ID
     * @param useStatus 可使用状态
     * @return 是否修改成功
     */
    boolean updatePhoneUseStatus(@NonNull String phoneId, @NonNull PhoneUseStatus useStatus);

    /**
     * 超时没有刷新可用状态的手机，修改为新的可用状态
     *
     * @param useStatus 可用状态
     * @param timeout   超时时间，单位秒
     */
    void updatePhoneUseStatus(@NonNull PhoneUseStatus useStatus, long timeout);

    /**
     * 查询用户手机列表
     *
     * @param userId 用户ID
     * @return 用户手机列表
     */
    List<UserPhone> getUserPhones(@NonNull String userId);

    /**
     * 给用户添加手机
     *
     * @param userPhones 用户手机
     * @return 是否添加成功
     */
    boolean addUserPhones(@NonNull List<UserPhone> userPhones);
}
